//TCP/IP 即传输控制协议/网间协议，是一种面向连接（连接导向）的、可靠的、基于字节流的传输层通信协议，
//因为是面向连接的协议，数据像水流一样传输，会存在黏包问题。
/*一个TCP服务端可以同时连接很多个客户端
TCP服务端程序的处理流程：
	1.监听端口
	2.接收客户端请求建立链接
	3.创建goroutine处理链接
*/
package main

import (
	"bytes"
	"fmt"
	"net"
	"time"
)

func main() {
	listen, err := net.Listen("tcp", "127.0.0.1:8080")
	if err != nil {
		fmt.Println("监听出错：", err)
		return
	}
	for {
		conn, err := listen.Accept() //建立连接
		if err != nil {
			fmt.Println("接收出错", err)
			continue
		}

		fmt.Println("客户端连接了：", conn.RemoteAddr())
		fmt.Println("服务端为：", conn.LocalAddr())
		go handleConn(conn) //启动一个goroutine处理连接
	}
}

func handleConn(conn net.Conn) {
	defer conn.Close() //关闭连接
	for {
		var buf [128]byte
		n, err := conn.Read(buf[:]) //读取数据
		if err != nil {
			fmt.Println("读取出错")
			break
		}
		fmt.Println(string(buf[:n])) //收到client端发来的数据
		time.Sleep(1 * time.Second)
		conn.Write(bytes.ToUpper(buf[:])) // 发送数据
	}
}
